package uy.com.csi.gestpro.managedbean.modules.informeDiario;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJBException;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;

import uy.com.csi.gestpro.constante.Estado;
import uy.com.csi.gestpro.datamodel.EmpresaDM;
import uy.com.csi.gestpro.datamodel.InformeDiarioDM;
import uy.com.csi.gestpro.dto.ActividadAvanceDto;
import uy.com.csi.gestpro.dto.UsuarioDto;
import uy.com.csi.gestpro.model.ejbremote.ActividadEjbRemote;
import uy.com.csi.gestpro.model.ejbremote.EmpresaEjbRemote;
import uy.com.csi.gestpro.model.ejbremote.EquipamientoEjbRemote;
import uy.com.csi.gestpro.model.ejbremote.InformeDiarioEjbRemote;
import uy.com.csi.gestpro.model.ejbremote.PersonalEjbRemote;
import uy.com.csi.gestpro.model.ejbremote.UsuarioEjbRemote;
import uy.com.csi.gestpro.model.mantenimiento.GpEmprsa;
import uy.com.csi.gestpro.model.proyecto.GpFtoInfrme;
import uy.com.csi.gestpro.model.proyecto.GpInfrmeDrio;
import uy.com.csi.gestpro.model.proyecto.GpSbcntrtsta;
import uy.com.csi.gestpro.model.view.GpVwActvdad;
import uy.com.csi.gestpro.model.view.GpVwActvdadFtro;
import uy.com.csi.gestpro.model.view.GpVwCmpraInfrme;
import uy.com.csi.gestpro.model.view.GpVwEqpmto;
import uy.com.csi.gestpro.model.view.GpVwPrsnalPrycto;
import uy.com.csi.gestpro.model.view.GpvwProyectoUsuario;
import uy.com.csi.gestpro.util.Archivo;
import uy.com.csi.gestpro.util.Constante;
import uy.com.csi.gestpro.util.Faces;
import uy.com.csi.gestpro.util.ServiceLocator;
import uy.com.csi.gestpro.util.UParametro;
import uy.com.csi.gestpro.util.UProperties;

@ViewScoped
@ManagedBean(name = "informeDiario")
public class InformeDiarioMB {
	private InformeDiarioEjbRemote infDiarioEjb;
	private EmpresaEjbRemote empEjb;
	private EquipamientoEjbRemote equipEjb;
	private ActividadEjbRemote actvdadEjb;
	private PersonalEjbRemote prsonalEjb;

	private ServiceLocator sl;

	private InformeDiarioDM infDm;
	private EmpresaDM empDm;
	private UsuarioDto usuario;

	private List<GpInfrmeDrio> infDiarioLst;
	private List<GpSbcntrtsta> gpEmList;
	private List<GpVwEqpmto> equipamientoLst;
	private List<GpVwActvdad> actvdadLst;
	private List<GpVwActvdadFtro> actvdadFtroLst;
	private List<GpVwPrsnalPrycto> prsnalPryctoLst;
	private List<ActividadAvanceDto> actividadLst;
	private List<ActividadAvanceDto> avanceFscoLst;
	private List<GpVwCmpraInfrme> cmpraInfrmeLst;
	private List<GpFtoInfrme> ftoInfrmeLst;
	private List<GpvwProyectoUsuario> personalLst;

	private GpInfrmeDrio infDiarioSlcted;
	private GpEmprsa empSlcted;
	private GpvwProyectoUsuario personalSlcted;
	private UsuarioEjbRemote ejbUsuario;

	public InformeDiarioMB() {
		sl = new ServiceLocator();

		usuario = (UsuarioDto) Faces.getVariable("usuario");

		infDiarioEjb = (InformeDiarioEjbRemote) sl.findServiceRemote(UProperties.getMessage(UParametro.RUTA_JNDI, "INFORME_DIARIO"),
				InformeDiarioEjbRemote.class.getName());
		empEjb = (EmpresaEjbRemote) sl.findServiceRemote(UProperties.getMessage(UParametro.RUTA_JNDI, "EMPRESA"), EmpresaEjbRemote.class.getName());
		equipEjb = (EquipamientoEjbRemote) sl.findServiceRemote(UProperties.getMessage(UParametro.RUTA_JNDI, "EQUIPAMIENTO"),
				EquipamientoEjbRemote.class.getName());
		actvdadEjb = (ActividadEjbRemote) sl.findServiceRemote(UProperties.getMessage(UParametro.RUTA_JNDI, "ACTIVIDAD"), ActividadEjbRemote.class.getName());
		prsonalEjb = (PersonalEjbRemote) sl.findServiceRemote(UProperties.getMessage(UParametro.RUTA_JNDI, "PERSONAL"), PersonalEjbRemote.class.getName());
		ejbUsuario = (UsuarioEjbRemote) sl.findServiceRemote(UProperties.getMessage(UParametro.RUTA_JNDI, "USUARIO"), UsuarioEjbRemote.class.getName());

		if (usuario.getRprteUsrio()) {
			infDiarioLst = infDiarioEjb.getInformeDiarioList(usuario.getProyecto().getId(), null);
			personalLst = ejbUsuario.getPersonalByProyecto(usuario.getProyecto().getId());
		} else {
			infDiarioLst = infDiarioEjb.getInformeDiarioList(usuario.getProyecto().getId(), usuario.getUsuario().getId());
		}

		infDm = new InformeDiarioDM(infDiarioLst);
		empDm = new EmpresaDM();

		infDiarioSlcted = new GpInfrmeDrio();
	}
	
	public String aplicarFiltro(){
		if(personalSlcted!=null){
			infDiarioLst = infDiarioEjb.getInformeDiarioList(usuario.getProyecto().getId(), personalSlcted.getIdUsrio());
		}else{
			infDiarioLst = infDiarioEjb.getInformeDiarioList(usuario.getProyecto().getId(), null);
		}
		
		infDm = new InformeDiarioDM(infDiarioLst);
		return "";
	}

	public void consultarInforme(SelectEvent event) {
		gpEmList = empEjb.getSubContratistaByInfDiario(infDiarioSlcted.getId());
		equipamientoLst = equipEjb.getVwEquipamientoLst(infDiarioSlcted.getId());
		actvdadFtroLst = actvdadEjb.getActvdadFtrosByInfrme(infDiarioSlcted.getId());
		actividadLst = ActividadAvanceDto.parseToActividadAvanceDto(actvdadEjb.getActvdadByInfrmeTpoLst(infDiarioSlcted.getId(), Constante.TIPO_ACTIVIDAD));
		avanceFscoLst = ActividadAvanceDto.parseToActividadAvanceDto(actvdadEjb.getActvdadByInfrmeTpoLst(infDiarioSlcted.getId(), Constante.TIPO_PORCENTAJE));
		prsnalPryctoLst = prsonalEjb.getPersonalActvdadByPyInfrme(usuario.getProyecto().getId(), infDiarioSlcted.getId());
		cmpraInfrmeLst = infDiarioEjb.getCmpraByInfrme(infDiarioSlcted.getId());
		ftoInfrmeLst = infDiarioEjb.getFtoByInfrme(infDiarioSlcted.getId());

		Archivo archivo = new Archivo();
		for (int i = 0; i < ftoInfrmeLst.size(); i++) {
			String rutaImg = Faces.rutaServidor() + Constante.FILE_IMAGE_DIRECTORY + ftoInfrmeLst.get(i).getNmbre();
			if (!archivo.ifExistFile(Faces.rutaServidor() + Constante.FILE_IMAGE_DIRECTORY, ftoInfrmeLst.get(i).getNmbre())) {
				archivo.copiarArchivo(rutaImg, Constante.FILE_SYSTEM_IMAGE_DIRECTORY + ftoInfrmeLst.get(i).getNmbre());
			}
		}

	}

	public List<GpInfrmeDrio> getInfDiarioLst() {
		return infDiarioLst;
	}

	public void setInfDiarioLst(List<GpInfrmeDrio> infDiarioLst) {
		this.infDiarioLst = infDiarioLst;
	}

	public GpInfrmeDrio getInfDiarioSlcted() {
		return infDiarioSlcted;
	}

	public void setInfDiarioSlcted(GpInfrmeDrio infDiarioSlcted) {
		this.infDiarioSlcted = infDiarioSlcted;
	}

	public InformeDiarioDM getInfDm() {
		return infDm;
	}

	public void setInfDm(InformeDiarioDM infDm) {
		this.infDm = infDm;
	}

	public List<GpSbcntrtsta> getGpEmList() {
		return gpEmList;
	}

	public void setGpEmList(List<GpSbcntrtsta> gpEmList) {
		this.gpEmList = gpEmList;
	}

	public EmpresaDM getEmpDm() {
		return empDm;
	}

	public void setEmpDm(EmpresaDM empDm) {
		this.empDm = empDm;
	}

	public GpEmprsa getEmpSlcted() {
		return empSlcted;
	}

	public void setEmpSlcted(GpEmprsa empSlcted) {
		this.empSlcted = empSlcted;
	}

	public List<GpVwEqpmto> getEquipamientoLst() {
		return equipamientoLst;
	}

	public void setEquipamientoLst(List<GpVwEqpmto> equipamientoLst) {
		this.equipamientoLst = equipamientoLst;
	}

	public List<GpVwActvdad> getActvdadLst() {
		return actvdadLst;
	}

	public void setActvdadLst(List<GpVwActvdad> actvdadLst) {
		this.actvdadLst = actvdadLst;
	}

	public List<ActividadAvanceDto> getActividadLst() {
		return actividadLst;
	}

	public void setActividadLst(List<ActividadAvanceDto> actividadLst) {
		this.actividadLst = actividadLst;
	}

	public List<ActividadAvanceDto> getAvanceFscoLst() {
		return avanceFscoLst;
	}

	public void setAvanceFscoLst(List<ActividadAvanceDto> avanceFscoLst) {
		this.avanceFscoLst = avanceFscoLst;
	}

	public List<GpVwActvdadFtro> getActvdadFtroLst() {
		return actvdadFtroLst;
	}

	public void setActvdadFtroLst(List<GpVwActvdadFtro> actvdadFtroLst) {
		this.actvdadFtroLst = actvdadFtroLst;
	}

	public List<GpVwPrsnalPrycto> getPrsnalPryctoLst() {
		return prsnalPryctoLst;
	}

	public void setPrsnalPryctoLst(List<GpVwPrsnalPrycto> prsnalPryctoLst) {
		this.prsnalPryctoLst = prsnalPryctoLst;
	}

	public List<GpVwCmpraInfrme> getCmpraInfrmeLst() {
		return cmpraInfrmeLst;
	}

	public void setCmpraInfrmeLst(List<GpVwCmpraInfrme> cmpraInfrmeLst) {
		this.cmpraInfrmeLst = cmpraInfrmeLst;
	}

	public List<GpFtoInfrme> getFtoInfrmeLst() {
		return ftoInfrmeLst;
	}

	public void setFtoInfrmeLst(List<GpFtoInfrme> ftoInfrmeLst) {
		this.ftoInfrmeLst = ftoInfrmeLst;
	}

	public void elmnarInfrmeDrio(ActionEvent event) {
		if (infDiarioSlcted != null) {
			infDiarioEjb.elmnarInfrme(infDiarioSlcted.getId());
			infDiarioLst.remove(infDiarioSlcted);
		}

		infDm = new InformeDiarioDM(infDiarioLst);
	}

	public String editarInforme() {
		eliminarVariables();
		Faces.registrarVariable("infDiario", infDiarioSlcted);
		Faces.registrarVariable("gpEmList", gpEmList);
		Faces.registrarVariable("equipamientoLst", equipamientoLst);
		Faces.registrarVariable("actividadLst", actividadLst);
		Faces.registrarVariable("avanceFscoLst", avanceFscoLst);
		Faces.registrarVariable("actvdadFtroLst", actvdadFtroLst);
		Faces.registrarVariable("prsnalPryctoLst", prsnalPryctoLst);
		Faces.registrarVariable("cmpraInfrmeLst", cmpraInfrmeLst);
		Faces.registrarVariable("ftoInfrmeLst", ftoInfrmeLst);
		return "/pages/modules/informe_diario/new_infrme_drio";
	}

	public String agregarInforme() {
		eliminarVariables();
		GpInfrmeDrio infDrio = new GpInfrmeDrio();
		infDrio.setGpPrycto(usuario.getProyecto());
		infDrio.setUsrnmeSnc(usuario.getUsuario().getNicknme());
		infDrio.setIdUsrio(usuario.getUsuario().getId());
		infDrio.setEstdo(Constante.EST_ON_INF_DIARIO);
		infDrio.setFchaRgstro(new Date());
		infDrio.setId(Constante.ID_EMPTY);
		infDrio.setFchaInfrme(new Date());
		Faces.registrarVariable("infDiario", infDrio);

		Faces.registrarVariable("gpEmList", new ArrayList<GpSbcntrtsta>());
		Faces.registrarVariable("equipamientoLst", equipEjb.getEquipamientoNew(usuario.getProyecto().getId()));
		Faces.registrarVariable("actividadLst",
				ActividadAvanceDto.parseToActividadAvanceDto(actvdadEjb.getActvdadNew(usuario.getProyecto().getId(), Constante.TIPO_ACTIVIDAD)));
		Faces.registrarVariable("avanceFscoLst",
				ActividadAvanceDto.parseToActividadAvanceDto(actvdadEjb.getActvdadNew(usuario.getProyecto().getId(), Constante.TIPO_PORCENTAJE)));
		Faces.registrarVariable("actvdadFtroLst", new ArrayList<GpVwActvdadFtro>());
		Faces.registrarVariable("prsnalPryctoLst", prsonalEjb.getPersonalActvdad(usuario.getProyecto().getId()));
		Faces.registrarVariable("cmpraInfrmeLst", new ArrayList<GpVwCmpraInfrme>());

		ftoInfrmeLst = new ArrayList<GpFtoInfrme>();
		GpFtoInfrme fto = new GpFtoInfrme();
		fto.setId(Constante.ID_EMPTY);
		fto.setNmbre(Constante.NOMBRE_IMAGEN_EMPTY);
		fto.setObsrvcion(Constante.OBSERVACION_IMAGEN_EMPTY);
		ftoInfrmeLst.add(fto);
		Faces.registrarVariable("ftoInfrmeLst", ftoInfrmeLst);

		return "/pages/modules/informe_diario/new_infrme_drio";
	}

	public void eliminarVariables() {
		Faces.removeVariable("infDiario");
		Faces.removeVariable("gpEmList");
		Faces.removeVariable("equipamientoLst");
		Faces.removeVariable("actividadLst");
		Faces.removeVariable("avanceFscoLst");
		Faces.removeVariable("actvdadFtroLst");
		Faces.removeVariable("prsnalPryctoLst");
		Faces.removeVariable("cmpraInfrmeLst");
		Faces.removeVariable("ftoInfrmeLst");

	}

	public String reporteInforme() {
		return "/pages/modules/informe_diario/reporte_infrme_drio";
	}

	public List<GpvwProyectoUsuario> getPersonalLst() {
		return personalLst;
	}

	public void setPersonalLst(List<GpvwProyectoUsuario> personalLst) {
		this.personalLst = personalLst;
	}

	public GpvwProyectoUsuario getPersonalSlcted() {
		return personalSlcted;
	}

	public void setPersonalSlcted(GpvwProyectoUsuario personalSlcted) {
		this.personalSlcted = personalSlcted;
	}
}
